using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 物品槽的抽象基类
public abstract class ItemSlot : ISerializationCallbackReceiver
{
    // 对数据的引用，使用[NonSerialized]属性表示在序列化时不包含该字段
    [NonSerialized] protected InventoryItemData itemData;

    // 用于序列化的字段
    [SerializeField] protected int _itemID = -1;
    [SerializeField] protected int stackSize;

    // 对外暴露的物品数据和堆叠大小属性
    public InventoryItemData ItemData => itemData;
    public int StackSize => stackSize;

    // 清空物品槽
    public void ClearSlot()
    {
        itemData = null;
        _itemID = -1;
        stackSize = 0;
    }

    // 分配一个物品给物品槽
    public void AssignItem(InventorySlot invSlot)
    {
        if (itemData == invSlot.ItemData)
        {
            AddToStack(invSlot.StackSize);
        }
        else
        {
            itemData = invSlot.ItemData;
            _itemID = itemData.ID;
            stackSize = 0;
            AddToStack(invSlot.StackSize);
        }
    }

    // 将当前背包的物品信息复制到克隆的背包系统中
    public void AssignItem(InventoryItemData data, int amount){
        if (itemData == data) AddToStack(amount);
        else
        {
            itemData = data;
            _itemID = data.ID;
            stackSize = 0;
            AddToStack(amount);
        }
    }

    // 将物品堆叠数量增加一定数量
    public void AddToStack(int amount)
    {
        stackSize += amount;
    }

    // 从物品堆叠中移除一定数量的物品
    public void RemoveFromStack(int amount)
    {
        stackSize -= amount;
        // 如果堆叠大小小于等于0，则清空槽位
        if(stackSize <= 0) ClearSlot();
    }

    // 在序列化之前的回调函数
    public void OnBeforeSerialize()
    {
        // 这里可以添加在序列化之前需要处理的逻辑
    }

    // 在反序列化之后的回调函数
    public void OnAfterDeserialize()
    {
        if (_itemID == -1)
            return;

        var db = Resources.Load<Database>("Database");
        itemData = db.GetItem(_itemID);
    }

    
}
